#ifndef STACK_QUEUE_H
#define STACK_QUEUE_H

#include <string>
#include <stdexcept>

class MyStack;

class listNode{
    friend class MyStack;
private:
    listNode* next;
    int data;
public:
    listNode();
    listNode(int nodeData, listNode* succ);
    ~listNode();
};

class MyStack{
    friend bool postfixExpression(const std::string& middle, std::string& last);
    friend bool expressionVal(const std::string& middle, int& value);
private:
    listNode* topNode;
    int stackSize;


public:
    MyStack();
    ~MyStack();

    bool push(const int&elem);
    bool pop(int&item);
    bool getTop(int& item);
    void printStack();
    bool isEmpty() const;
};

class MyQueue{
    friend void yanghui(const int& n);
private:
    int* queue;
    int capacity;
    int front;
    int rear;

public:
    MyQueue(const int&capacity);
    MyQueue(const MyQueue& other);
    MyQueue& operator=(const MyQueue& other);
    ~MyQueue();

    bool enQueue(const int&elem);
    bool deQueue(int&item);
    bool getFront(int&item);
    void printQueue();

    bool isEmpty();
    bool isFull();
};


bool postfixExpression(const std::string& middle, std::string& last);

bool expressionVal(const std::string& middle, int& value);

void yanghui(const int& n);

#endif



